home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / lang / PPCsmalltalk.lha / PPCSmallTalk / sources / line.c < prev    next >
C/C++ Source or Header  |  1986-10-19  |  2KB  |  103 lines

  1. /*
  2.     Little Smalltalk
  3.  
  4.         line grabber - does lowest level input for command lines.
  5. */
  6. /*
  7.     The source code for the Little Smalltalk System may be freely
  8.     copied provided that the source of all files is acknowledged
  9.     and that this condition is copied with each file.
  10.  
  11.     The Little Smalltalk System is distributed without responsibility
  12.     for the performance of the program and without any guarantee of
  13.     maintenance.
  14.  
  15.     All questions concerning Little Smalltalk should be addressed to:
  16.  
  17.         Professor Tim Budd
  18.         Department of Computer Science
  19.         The University of Arizona
  20.         Tucson, Arizona
  21.         85721
  22.         USA
  23. */
  24. # include <stdio.h>
  25. # include "object.h"
  26. # include "primitive.h"
  27.  
  28. # define MAXINCLUDE  10
  29. # define MAXBUFFER  1200        /* text buffer */
  30.  
  31. static FILE *fdstack[MAXINCLUDE];
  32. static int fdtop = -1;
  33.  
  34. static char buffer[MAXBUFFER];
  35. static char *buftop = buffer;
  36. char *lexptr = buffer;
  37. #define  empty 0
  38. #define  half 1
  39. #define filled 2
  40. static bufstate = empty;
  41. int inisstd = 0;
  42. extern object *o_tab;
  43.  
  44. /* set file - set a file on the file descriptor stack */
  45. set_file(fd)
  46. FILE *fd;
  47. {
  48.     if ((++fdtop) > MAXINCLUDE)
  49.         cant_happen(18);
  50.     fdstack[fdtop] = fd;
  51.     if (fd == stdin) inisstd = 1;
  52.     else inisstd = 0;
  53. }
  54.  
  55. /* line-grabber - read a line of text 
  56.     do blocked i/o if blocked is nonzero,
  57.     otherwise do non-blocking i/o */
  58.  
  59. int line_grabber(block)
  60. int block;
  61. {
  62.     /* if it was filled last time, it is now empty */
  63.     if (bufstate == filled) {
  64.         bufstate = empty;
  65.         buftop = buffer;
  66.         lexptr = buffer;
  67.         }
  68.  
  69.     if ( ! block)
  70.         return(0); /* for now, only respond to blocked requests*/
  71.     else while (bufstate != filled) {
  72.         if (fdtop < 0) {
  73.             fprintf(stderr,"no files to read\n");
  74.             return(-1);
  75.             }
  76.         if (inisstd && o_tab)
  77.             primitive(RAWPRINT, 1, &o_tab);
  78.         if (fgets(buftop, MAXBUFFER, fdstack[fdtop]) == NULL) {
  79.             bufstate = empty;
  80.             if (fdstack[fdtop] != stdin)
  81.                 fclose(fdstack[fdtop]);
  82.             if (--fdtop < 0) return(-1);
  83.             inisstd = (fdstack[fdtop] == stdin);
  84.             }
  85.         else {
  86.             bufstate = half;
  87.             while (*buftop) buftop++;
  88.             if (*(buftop-1) == '\n') {
  89.                 if (*(buftop-2) == '\\') {
  90.                     buftop -= 2;
  91.                     }
  92.                 else {
  93.                     if ((buftop - buffer) > MAXBUFFER)
  94.                         cant_happen(18);
  95.                     *buftop = '\0';
  96.                     bufstate = filled;
  97.                     }
  98.                 }
  99.             }    
  100.         }
  101.     return(bufstate == filled);
  102. }
  103.